module i2s_transmitter(
	input	wire	bclk,
	input	wire	lrclk,
	input	wire	rst_n,
	input	wire	data_vld,	//前级更改信号成功后，此位置1
	input	wire	[15:0]	rdata,
	input	wire	[15:0]	ldata,
	
	output	reg		ready,	//可作为信号指示前级发送下一组信号
	output	reg		sdata	
);

	/*LRCLK 边缘检测*/
	reg	lrclk_d;
	always @(negedge bclk or negedge rst_n) begin
		//接收到复位信号时
		if(!rst_n) begin
			lrclk_d <= 1'b0;
		end
		//在比特时钟的每一个下降沿,存储当前lrclk的情况
		else begin
			lrclk_d <= lrclk;
		end
	end
	//生成下降沿与上升沿的标志位
	wire lrclk_rising = {lrclk_d,lrclk} == 2'b01;
	wire lrclk_falling = {lrclk_d,lrclk} == 2'b10;
	
	/*主传输逻辑*/
	reg	[15:0]	ldata_s;
	reg [15:0]	rdata_s;
	reg	[15:0]	data_shift;
	reg	[3:0]	bit_counter;
	
	always @(negedge bclk or negedge rst_n) begin
    if(!rst_n) begin
        ldata_s <= 16'b0;
        rdata_s <= 16'b0;
        data_shift <= 16'b0;
        bit_counter <= 4'b0;
        ready <= 1'b1;
        sdata <= 1'b0;
    end
    else begin
        // 默认值
        ready <= 1'b1;  // 默认准备好，在锁存时拉低
        // sdata 的默认值在下面处理

        // ============================
        // 修复第一部分：数据锁存
        // ============================
        // 只要数据有效 (data_vld) 且我们准备好了 (ready)，就锁存数据。
        // 这与 lrclk 的状态完全无关。
        if (data_vld && ready) begin
            ldata_s <= ldata; // 锁存左声道数据
            rdata_s <= rdata; // 锁存右声道数据
            ready <= 1'b0;  // 告诉前级，数据已接收
        end

        // ============================
        // 修复第二部分：数据传输
        // ============================
        
        // 当检测到上升沿时,准备传输右声道信号
        if(lrclk_rising) begin
            // **修复**：从锁存后的寄存器 rdata_s 读取
            data_shift <= rdata_s;
            bit_counter <= 4'd15;
            sdata <= rdata_s[15];   // 发送右声道MSB
        end
        // 当检测到下降沿时,准备传输左声道信号
        else if(lrclk_falling) begin
            // **保持不变**：从锁存后的寄存器 ldata_s 读取
            data_shift <= ldata_s;
            bit_counter <= 4'd15;
            sdata <= ldata_s[15];   // 发送左声道MSB
        end
        // 正常数据移位
        else if (bit_counter > 0) begin
            sdata <= data_shift[bit_counter-1];
            bit_counter <= bit_counter - 4'd1;
        end
        // 空闲状态
        else begin
            sdata <= 1'b0;
        end
    end
end


endmodule